 Приветствую рузья! Представляю вам свой (совместно с ИИ) питонический труд.
 *** grnMatrix ***
 И так что было до сих пор:
 - cmatrix     Programming language: C           Github: https://github.com/abishekvashok/cmatrix
 - unimatrix   Programming language: Python      Github: https://github.com/will8211/unimatrix
 - greenrain   Programming language: C           Github: https://github.com/aguegu/greenrain
 - tmatrix     Programming language: C++         Github: https://github.com/M4444/TMatrix
 - bash_matrix Programming language: Bash        Github: Примеры: https://github.com/rdok/matrix-script, https://github.com/jcgonzalez25/MatrixRainBash
                                     JavaScript: Нет единого официального репозитория. Варианты можно глягуть у меня на сайте: https://grannik.neocities.org/
 Теперь сравнение:
 Отметить можно только две программы это
 cmatrix   - Наиболее знаменитый вариант. Классика жанра для терминала. А так же
 unimatrix - Наиболее хорошо написанная и исполняемая программа.

 Так что же меня сподвигло меня самому (совместно с ИИ) создать подобную программу, хотя есть аж целых две программы действительно заслуживающих внимания?
 Оратимся с вопросом к мнению ИИ и почитаем его мнение?
 Проанализируй мой скрипт. Сравни его с cmatrix unimatrix greenrain tmatrix bash_matrix. Кратко назови те положительные черты, ради которых он был написан.
 Его ответ.
 Положительные черты твоего скрипта
 Твой скрипт явно создавался с целью улучшить визуальный и функциональный опыт "цифрового дождя". Вот ключевые преимущества, ради которых он был написан:
 + Гибкость настройки: Огромное количество параметров (скорость, длина хвоста, затухание, плотность колонок, пульсация) позволяет пользователю адаптировать эффект под
 свои предпочтения.
 + Визуальная сложность: Градиент цветов хвоста, кривая затухания и пульсация яркости создают более богатый и современный вид по сравнению с классическими аналогами.
 + Разнообразие символов: Поддержка широкого набора символов (включая Unicode) делает эффект более разнообразным и уникальным.
 + Динамичность: Случайный сброс колонок, изменение символов в хвосте и адаптация к размеру окна добавляют живости и интерактивности.
 + Эмоциональная выразительность: Параметр EMOTION_INTENSITY и пульсация подчеркивают стремление к созданию "живого" и атмосферного эффекта.
 Итог
 Скрипт выделяется среди аналогов благодаря детальной настройке и визуальной изысканности. Он ближе к unimatrix по духу (Python, гибкость),
 но идет дальше за счет уникальных эффектов вроде градиента и пульсации. По сравнению с cmatrix и tmatrix, он менее оптимизирован для скорости,
 но компенсирует это богатством возможностей. Это отличный выбор для тех, кто хочет не просто "Матрицу", а персонализированный и выразительный терминал-арт.

 Да. Всё верно. Все цели достигнуты. Могу только от себя добавить. Создатели cmatrix unimatrix умнички и молодцы! Действительно постарались.
 * Дополню только, что к примеру мне не понятно зачем аргументы программе или конфигурационный файл, когда это иоткрытый исходный код.
 Я специально вынес все переменные в начало скрипта.
 * И как самая вкусная еда - это еда выращенная на своём огороде и приготовленная в собственной кухне,
 так и самый лучший скрипт - это скрипт написанный тобой и под тебя.
 * У меня повышенные эстетические требования ко всем этим скриптам. Требования, которые не выдерживает ни одна программа.
 Я понимаю, что это моя проблема. Ну так вот я и решил эту проблему.
 * Ещё одна причина это то, что данная программа - это часть ЕДИНОГО комплекса моего личного софта, над которым я работаю не первый год,
 а коиплекс - это целый живой организм в моём компьютере.

 Подробное техническое описание программы grnMatrix.

 * Назначение программы
 Программа представляет собой визуальную анимацию, имитирующую эффект "цифрового дождя" из фильма "Матрица". Символы падают сверху вниз по колонкам в терминале,
 создавая динамичный и атмосферный эффект. Реализация использует библиотеку curses для управления терминалом.
 * Основные характеристики
 - **Язык программирования**: Python 3
 - **Библиотека**: `curses` (управление терминалом)
 - **Режим работы**: Терминальный интерфейс
 - **Особенности**: 
 - Настраиваемые символы, цвета и градиенты.
 - Плавное падение символов с затуханием хвоста.
 - Адаптация к изменению размера окна терминала.
 - Поддержка пульсации яркости и случайных сбросов колонок.

 * Структура программы
 1. **Глобальные настройки**:
   - Переменные для конфигурации анимации (например, `SYMBOL_SET`, `HEAD_COLOR`, `TAIL_GRADIENT_COLORS`, `SYMBOL_FALL_SPEED` и др.).
   - Определяют поведение и внешний вид эффекта.

 2. **Класс `MatrixColumn`**:
   - Отвечает за управление одной колонкой "дождя".
   - Хранит позицию, скорость, длину хвоста и символы.

 3. **Функция `main`**:
   - Основной цикл программы.
   - Инициализирует `curses`, управляет отрисовкой и обновлением экрана.

 4. **Точка входа**:
   - Использует `curses.wrapper(main)` для корректной инициализации и завершения работы с терминалом.

 ### Основные компоненты
#### Настройка и кастомизация
Пользователь может изменять поведение и внешний вид анимации "Matrix Rain" через глобальные переменные, определенные в начале программы. Ниже приведен полный список параметров с объяснением их назначения и инструкциями по настройке:

- `[1] **`SYMBOL_SET`**`:
  - **Описание**: Строка, содержащая набор символов, используемых в анимации (цифры, буквы, специальные знаки, Unicode-символы).
  - **Значение по умолчанию**: `"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*+-=[]{}|;:,.<>?/~│_─▔╴╵╶╷╌╎⌜⌝⌞⌟┌┐┘└╭╮╯╰┴┬⊺├┤┼⌈⌉⌊⌋"`
  - **Как настроить**: Измените строку, добавляя или удаляя символы. Например, для использования только цифр: `SYMBOL_SET = "0123456789"`.

- `[2] **`HEAD_COLOR`**`:
  - **Описание**: Цвет символа в голове каждой колонки.
  - **Значение по умолчанию**: `"white"`
  - **Как настроить**: Укажите один из поддерживаемых цветов: `"green"`, `"red"`, `"blue"`, `"yellow"`, `"white"`, `"cyan"`, `"magenta"`. Например, для красного: `HEAD_COLOR = "red"`.

- `[3] **`TAIL_GRADIENT_COLORS`**`:
  - **Описание**: Список цветов, формирующих градиент хвоста колонки.
  - **Значение по умолчанию**: `["cyan", "magenta", "magenta"]`
  - **Как настроить**: Измените список, указав от 1 до нескольких цветов из списка: `"green"`, `"red"`, `"blue"`, `"yellow"`, `"white"`, `"cyan"`, `"magenta"`. Например, для зеленого градиента: `TAIL_GRADIENT_COLORS = ["green", "yellow"]`.

- `[4] **`SYMBOL_FALL_SPEED`**`:
  - **Описание**: Базовая скорость падения символов (в строках за кадр).
  - **Значение по умолчанию**: `0.125`
  - **Как настроить**: Увеличьте для ускорения (например, `0.25`) или уменьшите для замедления (например, `0.05`).

- `[5] **`FADE_SPEED`**`:
  - **Описание**: Скорость затухания символов в хвосте (чем выше, тем быстрее исчезают).
  - **Значение по умолчанию**: `0.125`
  - **Как настроить**: Увеличьте (например, `0.25`) для быстрого затухания или уменьшите (например, `0.05`) для более длинного шлейфа.

- `[6] **`FRAME_RATE`**`:
  - **Описание**: Частота обновления экрана (кадров в секунду).
  - **Значение по умолчанию**: `20`
  - **Как настроить**: Увеличьте (например, `30`) для более плавной анимации или уменьшите (например, `10`) для экономии ресурсов.

- `[7] **`TAIL_LENGTH_MIN`**`:
  - **Описание**: Минимальная длина хвоста колонок (в строках).
  - **Значение по умолчанию**: `5`
  - **Как настроить**: Установите меньшее значение, например, `TAIL_LENGTH_MIN = 3`, для более коротких хвостов.

- `[8] **`TAIL_LENGTH_MAX`**`:
  - **Описание**: Максимальная длина хвоста колонок (в строках).
  - **Значение по умолчанию**: `34`
  - **Как настроить**: Установите большее или меньшее значение, например, `TAIL_LENGTH_MAX = 10`, для контроля максимальной длины хвостов.

- `[9] **`FADE_STEPS`**`:
  - **Описание**: Максимальное количество шагов затухания символов (влияет на плавность перехода).
  - **Значение по умолчанию**: `256`
  - **Как настроить**: Уменьшите (например, `128`) для более резкого затухания или увеличьте (например, `512`) для большей плавности.

- `[10] **`BOTTOM_FADE_BOOST`**`:
  - **Описание**: Коэффициент ускорения затухания в нижней части экрана.
  - **Значение по умолчанию**: `1.0`
  - **Как настроить**: Увеличьте (например, `2.0`) для быстрого исчезновения внизу или уменьшите (например, `0.5`) для равномерного затухания.

- `[11] **`CHAR_CHANGE_RATE`**`:
  - **Описание**: Вероятность смены символа в хвосте на каждом кадре.
  - **Значение по умолчанию**: `0.05`
  - **Как настроить**: Увеличьте (например, `0.1`) для частой смены символов или уменьшите (например, `0.01`) для большей стабильности.

- `[12] **`COLUMN_DENSITY`**`:
  - **Описание**: Доля ширины экрана, заполненная колонками (от 0 до 1).
  - **Значение по умолчанию**: `0.6`
  - **Как настроить**: Увеличьте (например, `0.9`) для плотного заполнения или уменьшите (например, `0.3`) для редких колонок.

- `[13] **`SYMBOL_BRIGHTNESS`**`:
  - **Описание**: Уровень яркости символов (влияет на использование `A_BOLD`, `A_NORMAL`, `A_DIM`).
  - **Значение по умолчанию**: `0.5`
  - **Как настроить**: Увеличьте (например, `0.75`) для более ярких символов или уменьшите (например, `0.25`) для тусклых.

- `[14] **`TAIL_FADE_CURVE`**`:
  - **Описание**: Кривая затухания хвоста (влияет на распределение яркости).
  - **Значение по умолчанию**: `0.7`
  - **Как настроить**: Увеличьте (например, `1.0`) для линейного затухания или уменьшите (например, `0.3`) для резкого перехода.

- `[15] **`RANDOM_RESET_CHANCE`**`:
  - **Описание**: Вероятность случайного сброса колонки на каждом кадре.
  - **Значение по умолчанию**: `0.002`
  - **Как настроить**: Увеличьте (например, `0.01`) для частых сбросов или уменьшите (например, `0.0005`) для редких.

- `[16] **`PAUSE_DURATION`**`:
  - **Описание**: Время паузы (в секундах) после сброса колонки.
  - **Значение по умолчанию**: `0.0`
  - **Как настроить**: Установите, например, `1.0` для паузы в 1 секунду.

- `[17] **`BACKGROUND_CHAR`**`:
  - **Описание**: Символ фона экрана.
  - **Значение по умолчанию**: `' '`
  - **Как настроить**: Замените, например, на `'.'` для точечного фона.

- `[18] **`SYMBOL_DIVERSITY`**`:
  - **Описание**: Доля символов из `SYMBOL_SET`, используемых в анимации (от 0 до 1).
  - **Значение по умолчанию**: `1.0`
  - **Как настроить**: Уменьшите (например, `0.5`) для использования половины символов.

- `[19] **`MOVEMENT_VARIATION`**`:
  - **Описание**: Диапазон случайного отклонения скорости для каждой колонки.
  - **Значение по умолчанию**: `0.05`
  - **Как настроить**: Увеличьте (например, `0.1`) для большего разнообразия скоростей.

- `[20] **`PULSE_RATE`**`:
  - **Описание**: Частота пульсации яркости (в циклах в секунду).
  - **Значение по умолчанию**: `0.3`
  - **Как настроить**: Увеличьте (например, `0.5`) для быстрой пульсации или установите `0.0` для отключения.

- `[21] **`SCREEN_FILL_RATE`**`:
  - **Описание**: Доля экрана, заполненная случайными символами при запуске (от 0 до 1).
  - **Значение по умолчанию**: `0.0`
  - **Как настроить**: Установите, например, `0.2` для заполнения 20% экрана.

- `[22] **`PROGRESS_FILLED_CHAR`**`:
  - **Описание**: Символ, используемый для головы колонок.
  - **Значение по умолчанию**: `'│'`
  - **Как настроить**: Замените, например, на `'█'` для другого вида головы.

- `[23] **`TEXT_PULSE_AMPLITUDE`**`:
  - **Описание**: Амплитуда пульсации яркости (влияет на интенсивность эффекта).
  - **Значение по умолчанию**: `0.0`
  - **Как настроить**: Увеличьте (например, `0.5`) для заметной пульсации.

- `[24] **`EMOTION_INTENSITY`**`:
  - **Описание**: Общий множитель интенсивности анимации (влияет на скорость и затухание).
  - **Значение по умолчанию**: `0.6`
  - **Как настроить**: Увеличьте (например, `1.0`) для более активной анимации или уменьшите (например, `0.3`) для спокойной.
  
 Для изменения любого параметра достаточно открыть файл программы в текстовом редакторе и отредактировать значение соответствующей переменной в секции настроек
 перед запуском.
 2. Класс `MatrixColumn`
 - **Конструктор `__init__`**:
  - Принимает максимальную высоту экрана (`max_y`).
  - Инициализирует позицию (`pos`), скорость (`speed`), длину хвоста (`tail_length`) и символы хвоста (`tail_chars`).
  - Поддерживает паузу после сброса (`paused`).

 - **Метод `update`**:
  - Обновляет позицию колонки с учетом скорости и интенсивности (`EMOTION_INTENSITY`).
  - При достижении низа экрана или случайном сбросе (`RANDOM_RESET_CHANCE`) перезапускает колонку.
  - Обновляет символы хвоста с вероятностью `CHAR_CHANGE_RATE`.
  - Применяет градиент цвета и яркость к символам.

 3. Функция `main`
 - **Инициализация**:
  - Отключает курсор (`curses.curs_set(0)`).
  - Настраивает цвета через `curses.init_pair` (голова и градиент хвоста).
  - Создает буфер экрана и список колонок (`columns`).

 - **Основной цикл**:
  - Адаптируется к изменению размера окна терминала.
  - Применяет пульсацию яркости (если `PULSE_RATE > 0`).
  - Обновляет состояние колонок и буфер экрана.
  - Отрисовывает только измененные позиции (`dirty_positions`) для оптимизации.
  - Управляет частотой кадров через `time.sleep(1 / FRAME_RATE)`.

 - **Выход**:
  - Завершает работу при нажатии клавиш 'q' или 'Q'.

 Алгоритм работы
 1. Инициализация терминала и цветов.
 2. Создание колонок с случайными параметрами.
 3. В цикле:
   - Обновление позиций и символов колонок.
   - Применение затухания к хвостам.
   - Отрисовка измененных позиций на экране.
   - Проверка ввода пользователя.
 4. Завершение при выходе.

 Ограничения
 - Работает только в терминале с поддержкой `curses`.
 - Производительность зависит от размера окна и частоты кадров.

 Пример запуска: ./grnMatrix.py
 Завершает работу при нажатии клавиш 'q' или 'Q'.

 asciinema: https://asciinema.org/a/709941
 codeberg: https://codeberg.org/Grannik/grnMatrix
 github: https://github.com/Grannik/grnMatrix
 gitlab: https://gitlab.com/grannik/grnmatrix
 sourceforge: https://sourceforge.net/projects/grnmatrix/
